/*
   * 功能分析：
        * 加入购物车：详情页：存储数据到本地 ->改成：详情页点击加入购物车就跳转到购物车页-传数据过来-购物车页进行数据存储 -ok
        * 显示购物车数据：购物车页，获取本地存储数据渲染 -ok
        * 全选，全不选，单选：购物车页 -ok
        * 合计功能：购物车页 -ok
        * 数量加减：购物车页 -ok
        * 删除某个商品：：购物车页，删除前要弹窗再次确认 -ok
*/
/*
  [{
    gid : 商品id,
    gname : 商品标题,
    gprice : 商品价格,
    gnum : 购买商品数量,
    gimgUrl : 商品缩略图,
    gChecked : true
  }]
*/
class ShopCartCtrl{
  //获取购物车数据
  getCartData() {
    return wx.getStorageSync('shopcart') || [];
  }
  //存储购物车数据
  setCartData(data){
    wx.setStorageSync('shopcart', data);
  }
  //添加购物车
  addCart(goodInf){
    let goodsList = this.getCartData();
    //goodInf：传入的一条完整的商品信息
    //判断商品是否已经存在：不存在，新增一个商品信息；存在：修改商品数量
    let existIndex = this.isExist(goodInf.gid);
    if(existIndex == -1) {
      //不存在，新增一个商品信息
      goodsList.push(goodInf);
    }else{
      //存在：修改商品数量
      goodsList[existIndex].gnum = Number(goodsList[existIndex].gnum) + Number(goodInf.gnum);
    }
    //把数据重新存到本地存储
    this.setCartData(goodsList);
  }
  //判断是否存在商品
  isExist(gid) {
    let goodsList = this.getCartData();
    for(let index = 0; index < goodsList.length; index++) {
      if(goodsList[index].gid == gid){
        //说明存在该商品
        return index;
      }
    }
    //说明不存在该商品
    return -1;
  }
  //单选功能
  selGoodOne(gid) {
    //1.取出本地数据
    let goodsList = this.getCartData();
    //2.判断传入的gid是本地数据的第几条
    let selIndex = this.isExist(gid);
    //3.修改本条数据的选中状态
    goodsList[selIndex].gChecked = !goodsList[selIndex].gChecked;
    //4.重新存数据到本地
    this.setCartData(goodsList);
    //5.单选控制全选-联动效果: && 都为真才为真
    let result = goodsList.every(item => {
      return item.gChecked;
    });
    return result;//布尔值
  }
  //单选控制全选
  selCtrlAll() {
    //1.取出本地数据
    let goodsList = this.getCartData();
    //2.单选控制全选-联动效果: && 都为真才为真
    let result = goodsList.every(item => {
      return item.gChecked;
    });
    return result;//布尔值
  }
  //全选和全不选
  goodAllCheck(status) {
    //1.取出本地数据
    let goodsList = this.getCartData();
    //2.遍历数组，改变单选的状态
    for(let i = 0; i < goodsList.length; i++) {
      goodsList[i].gChecked = status;
    }
    //3.重新存数据到本地
    this.setCartData(goodsList);
  }
  //统计合计（总价格）和总数量
  getPriceCount() {
    //1.取出本地数据
    let goodsList = this.getCartData();
    //2.遍历数组。累加数据
    let price = 0;//存总价==合计
    let total = 0;//总数量
    goodsList.forEach(item => {
      if(item.gChecked) {
        //这个商品是准备要购买的
        total += item.gnum;
        //总价==小计相加==单价*数量
        price += Number(item.gprice) * item.gnum;
      }
    });
    return {total,price};
  }
  //加数量
  addGoodNum(gid) {
    //1.取出本地数据
    let goodsList = this.getCartData();
    //2.判断传入的gid是本地数据的第几条
    let selIndex = this.isExist(gid);
    //3.数量加1 :库存量 8
    if(goodsList[selIndex].gnum < 8) {
      goodsList[selIndex].gnum = Number(goodsList[selIndex].gnum) + 1;
    }
    //4.重新存数据到本地
    this.setCartData(goodsList);
  }
  //减数量
  cutGoodNum(gid) {
    //1.取出本地数据
    let goodsList = this.getCartData();
    //2.判断传入的gid是本地数据的第几条
    let selIndex = this.isExist(gid);
    //3.数量减1 : 最小是1
    if(goodsList[selIndex].gnum > 1) {
      goodsList[selIndex].gnum = Number(goodsList[selIndex].gnum) - 1;
    }
    //4.重新存数据到本地
    this.setCartData(goodsList);
  }
  //删除某个商品
  delect(gid) {
    //1.取出本地数据
    let goodsList = this.getCartData();
    //2.删除gid是传入的那条数据:留下满足条件
    let result = goodsList.filter(item => {
      return item.gid != gid;
    });
    //3.重新存数据到本地
    this.setCartData(result);
  }
}

module.exports = new ShopCartCtrl();//导出实例